#include "pion.h"

#include "partie.h"

GLint Pion::lid = 0;

GLint Pion::getLid() {
    return lid;
}

void Pion::calculDeplacements(bool suppr_echecs) {
    ajouterCoupPion(suppr_echecs, x,y,CASE_ACTUELLE);

    if (this->couleur == BLANC) {

        // Avancer
        if (y<7 && parent->LirePlateau(x,y+1) == NULL) {
            ajouterCoupPion(suppr_echecs, x,y+1,DEPLACEMENT);
        }

        // Prendre en haut à gauche
        if ((y<7 && x>0) && parent->LirePlateau(x-1,y+1) != NULL && parent->LirePlateau(x-1,y+1)->getCouleur() != this->couleur) {
            ajouterCoupPion(suppr_echecs, x-1,y+1,CAPTURE);
        }
        // Prendre en haut à droite
        if ((y<7 && x<7) && parent->LirePlateau(x+1,y+1) != NULL && parent->LirePlateau(x+1,y+1)->getCouleur() != this->couleur) {
            ajouterCoupPion(suppr_echecs, x+1,y+1,CAPTURE);
        }

        // Double pas
        if (y==1 && parent->LirePlateau(x,y+1) == NULL && parent->LirePlateau(x,y+2) == NULL) {
            ajouterCoupPion(suppr_echecs, x,y+2,DEPLACEMENT_DOUBLE);
        }

        // Prise en passant
        if (y==4 && y == parent->getEnPassantY()-1 && (x == parent->getEnPassantX()-1 || x == parent->getEnPassantX()+1)) {
            ajouterCoupPion(suppr_echecs, parent->getEnPassantX(),parent->getEnPassantY(),EN_PASSANT);
        }

        // Promotion
        /*for (int i=0; i<8; i++) {
            if (parent->matriceDepl[i][7] != AUCUN_COUP) {
                parent->matriceDepl[i][7] = PROMOTION; // ??? SI CAPTURE ??? TODO --> verifier après le coup si case vide ou piece adverse ?!
            }
        }*/

    }

    else { // NOIRS

        // Avancer
        if (y>0 && parent->LirePlateau(x,y-1) == NULL) {
            ajouterCoupPion(suppr_echecs, x,y-1,DEPLACEMENT);
        }

        // Prendre en haut à gauche
        if ((y>0 && x<7) && parent->LirePlateau(x+1,y-1) != NULL && parent->LirePlateau(x+1,y-1)->getCouleur() != this->couleur) {
            ajouterCoupPion(suppr_echecs, x+1,y-1,CAPTURE);
        }
        // Prendre en haut à droite
        if ((y>0 && x>0) && parent->LirePlateau(x-1,y-1) != NULL && parent->LirePlateau(x-1,y-1)->getCouleur() != this->couleur) {
            ajouterCoupPion(suppr_echecs, x-1,y-1,CAPTURE);
        }

        // Double pas
        if (y==6 && parent->LirePlateau(x,y-1) == NULL && parent->LirePlateau(x,y-2) == NULL) {
            ajouterCoupPion(suppr_echecs, x,y-2,DEPLACEMENT_DOUBLE);
        }

        // Prise en passant
        if (y==3 && y == parent->getEnPassantY()+1 && (x == parent->getEnPassantX()-1 || x == parent->getEnPassantX()+1)) {
            ajouterCoupPion(suppr_echecs, parent->getEnPassantX(),parent->getEnPassantY(),EN_PASSANT);
        }

        // Promotion
        /*for (int i=0; i<8; i++) {
            if (parent->matriceDepl[i][0] != AUCUN_COUP) {
                parent->matriceDepl[i][0] = PROMOTION; // ??? SI CAPTURE ??? TODO --> verifier après le coup si case vide ou piece adverse ?!
            }
        }*/

    }
}


void Pion::ajouterCoupPion(bool suppr_echecs, int x, int y, Coup coup) {
    if ( (this->couleur == BLANC && y==7)  ||  (this->couleur == NOIR && y==0) ) {
        if (coup == DEPLACEMENT)
            coup = PROMOTION_DEPLACEMENT;
        else if (coup == CAPTURE)
            coup = PROMOTION_CAPTURE;
    }

    ajouterCoup(suppr_echecs,x,y,coup);
}

